package allaboutmybook;

import java.util.LinkedList;

import dao.DaoConcretoPontosPositivosQueOLivroTem;
import dao.DaoPontosPositivosQueOLivroTem;
import excecoes.DAOException;

public class GerenteConcretoPontosPositivosQueOLivroTem implements GerentePontosPositivosQueOLivroTem
{
	private DaoPontosPositivosQueOLivroTem daoPontosPositivosLivro;
	private static GerenteConcretoPontosPositivosQueOLivroTem gerentePontosPositivosLivro;
	
	private GerenteConcretoPontosPositivosQueOLivroTem()
	{
		this.daoPontosPositivosLivro = new DaoConcretoPontosPositivosQueOLivroTem();
	}
	
	public synchronized static GerenteConcretoPontosPositivosQueOLivroTem getInstance()
	{
		if(gerentePontosPositivosLivro == null)
		{
			gerentePontosPositivosLivro = new GerenteConcretoPontosPositivosQueOLivroTem();
		}
		return gerentePontosPositivosLivro;
	}
	
	@Override
	public LinkedList<PontoPositivo> pegarTodosOsPontosPositivosDoLivro() throws DAOException
	{
		LinkedList<PontoPositivo> todosOsPontosPositivosDoLivro = 
				this.daoPontosPositivosLivro.pegarTodosOsPontosPositivosDoLivro();
		return todosOsPontosPositivosDoLivro;
	}

	@Override
	public void adicionarPontoPositivoParaOLivro(String nomePontoPositivo) throws DAOException
	{
		PontoPositivo pontoPositivo = obterPontoPositivoComBaseNoNome(nomePontoPositivo);
		this.daoPontosPositivosLivro.adicionarPontoPositivoParaOLivro(pontoPositivo);
		
	}

	@Override
	public void removerPontoPositivoParaOLivro(String nomePontoPositivo) throws DAOException
	{
		PontoPositivo pontoPositivo = obterPontoPositivoComBaseNoNome(nomePontoPositivo);
		this.daoPontosPositivosLivro.removerPontoPositivoParaOLivro(pontoPositivo);
		
	}
	
	private PontoPositivo obterPontoPositivoComBaseNoNome(String nomePontoPositivo) 
	{
		GerenciaTodosOsPontosPositivosQueUmLivroPodeTer conheceTodosOsPontosPositivosPossiveis =
				GerenciaTodosOsPontosPositivosQueUmLivroPodeTer.getInstance();
		LinkedList<PontoPositivo> todosOsPontosPositivosQueUmLivroPodeTer =
				conheceTodosOsPontosPositivosPossiveis.getTodosOsPontosPositivosQueUmLivroPodeTer();
		for(int i = 0; i < todosOsPontosPositivosQueUmLivroPodeTer.size(); i++)
		{
			PontoPositivo umPontoPositivo = todosOsPontosPositivosQueUmLivroPodeTer.get(i);
			if(umPontoPositivo.getNome().compareTo(nomePontoPositivo) == 0)
			{
				return umPontoPositivo;
			}
		}
		
		return null;
	}

	@Override
	public LinkedList<PontoPositivo> pegarTodosOsPontosPositivosQueOLivroNaoTem() throws DAOException
	{
		LinkedList<PontoPositivo> pontosPositivosQueOLivroNaoTem =
															new LinkedList<PontoPositivo>();
		GerenciaTodosOsPontosPositivosQueUmLivroPodeTer conheceTodosOsPontosPositivosPossiveis =
				GerenciaTodosOsPontosPositivosQueUmLivroPodeTer.getInstance();
		LinkedList<PontoPositivo> todosOsPontosPositivosQueUmLivroPodeTer =
				conheceTodosOsPontosPositivosPossiveis.getTodosOsPontosPositivosQueUmLivroPodeTer();
		
		for(int i = 0; i < todosOsPontosPositivosQueUmLivroPodeTer.size(); i++)
		{
			PontoPositivo umPontoPositivo = todosOsPontosPositivosQueUmLivroPodeTer.get(i);
			String nomePontoPositivo = umPontoPositivo.getNome();
			
			if(this.daoPontosPositivosLivro.livroPossuiPontoPositivoComEsseNome(nomePontoPositivo) == false)
			{
				pontosPositivosQueOLivroNaoTem.add(umPontoPositivo);
			}
		}
		return pontosPositivosQueOLivroNaoTem;
	}


}
